#ifndef __Mylogger_HH__
#define __Mylogger_HH__

#include <log4cpp/Category.hh>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdarg> // 添加 va_list 支持

// 删除旧的 addPrefix 宏
// 定义新的日志宏，支持格式化字符串和位置信息
#define LogWarn(fmt, ...) \
    Mylogger::getInstance()->warn(__FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LogError(fmt, ...) \
    Mylogger::getInstance()->error(__FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LogDebug(fmt, ...) \
    Mylogger::getInstance()->debug(__FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)

#define LogInfo(fmt, ...) \
    Mylogger::getInstance()->info(__FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)

class Mylogger
{
public:
    // 添加支持位置信息和格式化字符串的函数
    void warn(const char* file, const char* func, int line, const char* fmt, ...);
    void error(const char* file, const char* func, int line, const char* fmt, ...);
    void debug(const char* file, const char* func, int line, const char* fmt, ...);
    void info(const char* file, const char* func, int line, const char* fmt, ...);
    
    static Mylogger * getInstance();
    static void destroy();

    Mylogger(const Mylogger &) = delete;
    Mylogger & operator=(const Mylogger &) = delete;
    
private:
    Mylogger();
    ~Mylogger();

    // 添加前缀函数
    std::string addPrefix(const char* file, const char* func, int line, const std::string& msg);
    
    // 格式化消息的通用函数
    std::string formatMessage(const char* fmt, va_list args);
    
    // 处理日志的核心函数
    void log(log4cpp::Priority::Value priority, 
             const char* file, const char* func, int line, 
             const char* fmt, va_list args);

private:
    log4cpp::Category & _mycat;
    static Mylogger * _pInstance;
};

#endif